#ifndef VEC2_HPP_
#define VEC2_HPP_

#include <string>
#include <iostream>
#include <array>

namespace gmath
{
  template <class T> class Vec2
  {
    public:
      Vec2();
      Vec2(T value);
      Vec2(T x, T y);
      Vec2(T* ptr);

      const std::array<T, 2>& getData() const;
      void setData(const std::array<T, 2> data);
      void setData(T value);
      void setData(T x, T y);
      void setData(T* ptr);

      T length();
      T dot(Vec2& v2);

      std::string toString();

      Vec2 operator+(Vec2& v2);
      Vec2 operator-(Vec2& v2);
      Vec2 operator*(T a);
      Vec2 operator/(T a);
      Vec2 operator+=(Vec2& v2);
      Vec2 operator-=(Vec2& v2);
      Vec2 operator*=(T a);
      Vec2 operator/=(T a);
      template<typename J> friend std::ostream& 
          operator<<(std::ostream& out, Vec2<J> v);

    private:
      std::array<T, 2> data_;
  };

  typedef Vec2<float> Vec2f;
  typedef Vec2<double> Vec2d;
  typedef Vec2<int> Vec2i;
}

#include "Vec2.inl"

#endif
